package com.example.creatation.singleton;

import java.util.Objects;

/**
 * 单例模式 懒汉模式创建
 */
public class Person {
    private String name;
    private String age;

    //volatile解决指令重排问题 内存可见性
    private volatile static Person instance;

    /**
     * Constructor privatization
     */
    private Person() {
        System.out.println("create Person Instance");
    }

    /**
     * 多线程模式下 可能new 多个 Person对象
     * 使用 synchronized锁住
     * 直接放在方法上synchronized 效率不高
     *
     * @return Person
     */
    public static synchronized Person Boss() {
        if (Objects.isNull(instance)) {
            instance = new Person();
        }
        return instance;
    }

    /**
     * 多线程模式下 可能new 多个 Person对象
     * 使用 synchronized锁住
     * 双重锁校验 + 内存可见性
     *
     * @return Person
     */
    public static Person Boss1() {
        if (Objects.isNull(instance)) {
            synchronized (Person.class) {
                //双重锁 检查多线程问题
                if (Objects.isNull(instance))
                    instance = new Person();
            }
        }
        return instance;
    }
}


/*
 * 单例模式 饿汉模式 创建
 */
/*
  Direct acquisition 饿汉模式
public class Person {
    private String name;
    private String age;

    private final static Person instance = new Person();

    private Person(){
        System.out.println("create Person Instance");
    }

    public static Person Boss(){
        return instance;
    }
}


*/